package payment.mobilepos.unionpay.com.demo;

/**
 * 数据格式化
 * <ol>
 * 该类主要解决语音输入时携带汉字或者汉字数字混合的字符串情况
 * <li>该类会将除{'分','毛','块','十','百','千','万','亿','一','二','三'...}以外所有的汉字移除并替换格式补位.
 * 即'十'放在十位,'百'放在百位...
 * <li>例如:你好，280元----->280;两百八十元------>280
 * <ol>
 *
 * @author li'mingqi
 * @version 1.0
 */
public class LDataFormat {
    // 全局数组,存储单位量级
    public static String[] strCHup = { "亿", "万", "千", "百", "十", "元" };

    /***
     * 格式化数据
     *
     * @param source
     *            语音输入的数据
     * @return 返回格式化后的数字字符串
     *
     *         li'mingqi 2014-12-11
     *
     **/
    public static String format(String source) {
        // 1,去除不相干的文字信息
        char[] pt = source.toCharArray();
        for (int i = 0; i < pt.length; i++) {
            char k = pt[i];
            if (k == '一' || k == '二' || k == '两' || k == '三' || k == '四'
                    || k == '五' || k == '六' || k == '七' || k == '八' || k == '九'
                    || k == '十' || k == '百' || k == '千' || k == '万' || k == '亿'
                    || k == '0' || k == '1' || k == '2' || k == '3' || k == '4'
                    || k == '5' || k == '6' || k == '7' || k == '8' || k == '9') {

            } else {
                source = source.replace(k + "", "");
            }
        }
        // 去除空格间隙
        source.trim();
        // 2,汉字'十','百','千'的转换
        long money = 0;
        // 如果不是数字也就是 一千万这样的汉字 ---则需要转换 如 一百五十万----1500000
        if (source.contains("一") || source.contains("二")
                || source.contains("两") || source.contains("三")
                || source.contains("四") || source.contains("五")
                || source.contains("六") || source.contains("七")
                || source.contains("八") || source.contains("九")
                || source.contains("十") || source.contains("百")
                || source.contains("千") || source.contains("万")
                || source.contains("亿")) {
            money = excuteCharge(source);
        }
        // 数据的来源直接就是阿拉伯数字 如200元---此时元已经去掉，即数字200
        else {
            if (!"".equals(source)) {
                money = Integer.parseInt(source);
            }
        }
        // 3,返回最终格式化结果

        return money + "";
    }

    /***
     * 通过两次递归调用实现分割.
     *
     * @param str
     * @return li'mingqi 2014-12-11
     */
    public static long excuteCharge(String str) {
        // 存储量级单位
        long midNumber = 0;
        // 存储是否可以找到最高量级
        int bre = -1;
        // 找到后根据索引实行字符串分割
        int split = 0;
        // 通过循环查找最高量级
        for (int i = 0; i < strCHup.length; i++) {
            bre = str.indexOf(strCHup[i]);
            if (bre != -1) {
                split = i;
                switch (i) {
                    case 0:
                        midNumber = 100000000;
                        break;
                    case 1:
                        midNumber = 10000;
                        break;
                    case 2:
                        midNumber = 1000;
                        break;
                    case 3:
                        midNumber = 100;
                        break;
                    case 4:
                        midNumber = 10;
                        break;
                    case 5:
                        midNumber = 1;
                        break;
                }
                // 只需要找到最高量级,找到即刻跳出循环.
                break;
            }

        }
        // 如果没有找到量级数.说明该数很小,直接调用add()返回该值.
        if (bre == -1) {
            return add(str);
        }
        // 否则要根据量级进行字符串侵害和返回侵害前部分的值
        else {
            // 如果大型整数,如:十万 等.因为后面不需要再分割
            if (str.length() == bre + 1) {
                // 对于单个量级的值,如:十、百、千、万等。不需要裁减字符串。直接返回量级即可
                if (str.length() == 1) {
                    return midNumber;
                } else {
                    return add(str.substring(0, str.length() - 1)) * midNumber;
                }
            }
            // 对于只有两位数的.如:十九.直接调用add()返回值即可.不能在此处递归.
            else if (str.length() == bre + 2) {
                return add(str);
            }
            // 其他情况则取值和分割.然后再递归调用.
            else {
                String[] strPart = str.split(strCHup[split]);
                return (add(strPart[0]) * midNumber) + excuteCharge(strPart[1]);
            }
        }

    }

    public static long add(String str) {
        // 存储strCHup里具体汉字的数字值
        long mid = 0;
        // 存储strNumup里具体汉字的数字值
        int number = 0;
        // 存储传入字符串的最高级别单位在strCHup数组里的索引.
        int num = -1;
        for (int i = 0; i < strCHup.length; i++) {
            // 取得量级在字符串中的索引.
            num = str.indexOf(strCHup[i]);
            // 定义char型变量,存储每个汉字.便于后面比较
            char ch = ' ';
            // //////////////////////////////////////////////////////////////
            if (num != -1) {

                switch (i) {
                    case 0:
                        mid = 100000000;
                        break;
                    case 1:
                        mid = 10000;
                        break;
                    case 2:
                        mid = 1000;
                        break;
                    case 3:
                        mid = 100;
                        break;
                    case 4:
                        mid = 10;
                        break;
                    case 5:
                        mid = 1;
                        break;
                }

                // 如果以"十"开关的,直接定义number的值.因为在上面能够找到它的量级.
                if ((str.toCharArray())[0] == '十') {
                    number = 1;
                }
                // 否则,取得量级前的数字进行比较,再确定number的值
                else {
                    if (0 != num) {
                        ch = (str.toCharArray())[num - 1];
                    }
                }

                // ////////////////////////////////////////////////////
            }
            // 循环结束
            // ////////////////////////////////////////////////////////////////
            // 如果整个字符串就一个字,那么就应该取该值进行比较.而不是再取量级前的数字.
            if (str.length() == 1) {

                ch = (str.toCharArray())[0];
            }
            // 防止几万零几这样的数.
            else if ((str.length() == 2) && ((str.toCharArray())[0] == '零')) {
                ch = (str.toCharArray())[1];
            }
            switch (ch) {
                case '零':
                    number = 0;
                    break;
                case '一':
                    number = 1;
                    break;
                case '二':
                    number = 2;
                    break;
                case '两':
                    number = 2;
                    break;
                case '三':
                    number = 3;
                    break;
                case '四':
                    number = 4;
                    break;
                case '五':
                    number = 5;
                    break;
                case '六':
                    number = 6;
                    break;
                case '七':
                    number = 7;
                    break;
                case '八':
                    number = 8;
                    break;
                case '九':
                    number = 9;
                    break;
            }
            // ///////////////////////////////////////////////////////////////

            if (num != -1) {
                break;
            }

        }
        if (num == -1) {
            return number;
        }

        String strLeft = str.substring(num + 1);
        return (number * mid) + add(strLeft);
    }
}
